package com.example.demospringmybatisplus.service;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demospringmybatisplus.mapper.NodeMapper;
import com.example.demospringmybatisplus.vo.NodeVo;

/**
 * NodeService接口
 *
 * @author huahua
 * @DATE 2024/9/28
 **/
@Service
public class NodeService {
    @Autowired
    private NodeMapper nodeMapper;
    public List<String> getNodeListByName(String name){
        // 通过sql语句中distinct去重
        return nodeMapper.getNodeListByName(name);
    }

    public Set<String> getNodeSetByName(String name){
        // 通过set集合去重
        return nodeMapper.getNodeSetByName(name);
    }

    public List<String> getNodeListNoDistinctByName(String name){
        // 通过xxx.stream().distinct()去重
        List<String> nodeListNoDistinctByName = nodeMapper.getNodeListNoDistinctByName(name);
        return nodeListNoDistinctByName.stream().distinct().collect(Collectors.toList());
    }

    public List<NodeVo> getNodeListNoEmptyNameByEsn(String esn){
        return nodeMapper.getNodeListNoEmptyNameByEsn(esn);
    }

    public List<NodeVo> getNodeListByEsn(String esn){
        return nodeMapper.getNodeListByEsn(esn);
    }

    /**
     * 无事务插入数据库，防止并发插入
     * @param nodeVo 网元信息
     */
    public void insertNode(NodeVo nodeVo){
        // 1.先根据id查询数据库中是否存在该数据，如果存在则代表已经插入过了，直接返回
        NodeVo node = nodeMapper.selectById(nodeVo.getId());
        if(node != null){
            return;
        }
        int oldId = nodeVo.getId();

        // 2.不存在此条数据，插入数据库
        nodeMapper.insert(nodeVo);
        // 3.获取插入后的自增主键id
        int newId = nodeVo.getId();
        // 4.防止并发场景，再次查询一次，如果id一致，则代表插入成功。如果id不一致，则代表插入失败，删除这条旧数据
        NodeVo newNode = nodeMapper.selectById(newId);
        if(newNode.getId() == newId){
            return;
        }
        // 5.如果id不一致，则代表插入失败，需要删除旧数据
        nodeMapper.deleteById(oldId);
    }
}
